Итак, мы можем получить обьект CRecordset, например, как ниже. Теперь пора изучить его свойства. Открытие сильно упрощено.
void CDatebaseDlg::OnOpen()
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::snapshot,
"SELECT Family,Count FROM TABLE1", CRecordset::readOnly );
//........
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}
Нам может понадобиться SQL, на основе которого создан данный источник строк:
// Описание const CString& GetSQL( ) const; //...... cr.Open(CRecordset::snapshot,"SELECT Family,Count FROM TABLE1",CRecordset::readOnly); AfxMessageBox(cr.GetSQL()); //......
Теперь надо проанализировать сколько столбцов нам вернулось. Вы можете сказать: "ведь мы знаем, что два из запроса SQL", но запрос можно построить и так, что это будет не факт. Смотрите SELECT. Получаем количество столбцов:
// Описание short GetODBCFieldCount( ) const; short nFields = cr.GetODBCFieldCount();
Используя количество столбцов можно получить о них информацию с помощью GetODBCFieldInfo():
// Описание void GetODBCFieldInfo( short nIndex,
// CODBCFieldInfo& fieldinfo ); throw( CDBException );
short nFields = cr.GetODBCFieldCount();
for (short x=0;x < nFields;x++)
{
CODBCFieldInfo fieldinfo;
short pos=x;
cr.GetODBCFieldInfo(pos,fieldinfo );
AfxMessageBox(fieldinfo.m_strName);
}
Информация о типе полей находится в струтуре CODBCFieldInfo():
struct CODBCFieldInfo
{
CString m_strName;
SWORD m_nSQLType;
UDWORD m_nPrecision;
SWORD m_nScale;
SWORD m_nNullability;
};
Мы воспользовались данными из структуры m_strName. В этом поле структуры находится имя столбца запроса.
Второе поле m_nSQLType говорит нам о типе данных в данной колонке. Вот описание типов. Вы, наверно, заметили, что я перечислил не все возможные типы, например, нет OLE.
#define SQL_UNKNOWN_TYPE 0 #define SQL_CHAR 1 #define SQL_NUMERIC 2 #define SQL_DECIMAL 3 #define SQL_INTEGER 4 #define SQL_SMALLINT 5 #define SQL_FLOAT 6 #define SQL_REAL 7 #define SQL_DOUBLE 8 #define SQL_DATETIME 9 #define SQL_VARCHAR 12
Пример ниже показывает как этим можно воспользоваться. Он просматривает все колонки в поисках поля типа Integer и при нахождении выдает о нем информацию:
for (short x=0;x < nFields;x++)
{
CODBCFieldInfo fieldinfo;
short pos=x;
cr.GetODBCFieldInfo(pos,fieldinfo );
if (fieldinfo.m_nSQLType==SQL_INTEGER)
AfxMessageBox("integer " + fieldinfo.m_strName);
}
Поле структуры m_nPrecision соотвествует в ACCESS ширине поля. Вот этой позиции структуры базы:

Поле Scale говорит о том, сколько знаков после запятой у числового поля, а m_nNullability отвечает за то, может ли это поле принимать NULL. И для этого данное поле необходимо сравнить с SQL_NULLABLE или с SQL_NO_NULLS.